// 声明式
function a1(a: string): string {
  return '1';
}

// 函数表达式
let fn3: (a: string) => string = function (a = '1') {
  return '';
}

// 使用type声明
type callback1 = (a: string) => string;

let fn33: callback1 = function (a) {
  return '';
}
// 使用interface声明
interface ICallBack {
  (a: string): string;
}

let fn44: ICallBack = (a) => {
  return ''
}

// 可选参数和默认参数
let div21 = document.querySelector('div');
function css21(el: HTMLElement, attr: string, val?: any) {
  // ...
}

div21 && css21(div21, 'width', '100px');
div21 && css21(div21, 'width');

// 默认参数
// 1、有默认值的参数是可选的
// 2、有默认值的自动推导

function sort(item: number[], order: 'desc' | 'asc' = 'desc') {
  //...
}
sort([1, 2, 3], 'asc');
sort([1, 2, 3]);

// 剩余参数
interface IObj {
  [key: string]: any;
}
function merge(target: IObj, ...others: IObj[]) {
  return Object.assign(target, ...others);
}

merge({ x: 1 }, { y: 2 });